/// 应用的入口点，负责初始化和启动整个 Flutter 应用。
///
/// 本文件采用了延迟加载（Deferred Loading）技术来优化应用的初始启动时间。
/// 通过 `deferred as` 关键字，`pos_entry.dart` 文件及其依赖项会在需要时才被加载，
/// 而不是在应用启动时立即加载。这对于大型应用或特定功能模块不总是立即需要的情况特别有用。
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'src/features/pos/pos_entry.dart' deferred as pos_entry;

/// 应用的主函数，程序的执行从这里开始。
void main() {
  // 初始化日志记录器
  Logger.root.level = Level.ALL; // 记录所有级别的日志
  Logger.root.onRecord.listen((record) {
    // ignore: avoid_print
    print('${record.level.name}: ${record.time}: ${record.message}');
  });
    // 启动 Flutter 应用，将 DeferredApp 作为根 Widget。
  runApp(const DeferredApp());
}

/// DeferredApp 是一个 StatefulWidget，作为应用启动时的占位符和加载器。
///
/// 它负责触发 `pos_entry` 模块的异步加载，并在加载过程中显示一个加载指示器。
/// 加载完成后，它会将界面替换为真正的应用主界面。
class DeferredApp extends StatefulWidget {
  const DeferredApp({super.key});

  @override
  State<DeferredApp> createState() => _DeferredAppState();
}

/// DeferredApp 的状态管理类。
class _DeferredAppState extends State<DeferredApp> {
  final _log = Logger('DeferredApp');

    // 用于跟踪 `pos_entry` 模块加载过程的 Future。
  Future<void>? _loadFuture;

    /// 在 Widget 初始化时调用，这里我们开始加载 POS 模块。
  @override
  void initState() {
    super.initState();
        // 调用 _loadPosEntry 方法来异步加载 POS 功能模块。
    _loadFuture = _loadPosEntry();
  }

    /// 异步加载 `pos_entry` 库。
  ///
  /// `pos_entry.loadLibrary()` 是一个由 Dart 编译器在 `deferred as` 导入时自动生成的方法。
  /// 调用它会触发相关代码库的下载和加载。
  Future<void> _loadPosEntry() async {
    _log.info('Start loading POS module...');
    await pos_entry.loadLibrary();
    _log.info('POS module library loaded.');
  }

    /// 构建 Widget 树。
  ///
  /// 使用 FutureBuilder 来根据 `_loadFuture` 的状态构建不同的界面。
  /// 在加载过程中，显示一个 `CircularProgressIndicator`。
  /// 加载完成后，如果成功，则显示由 `pos_entry.createPosApp()` 创建的主应用界面；
  /// 如果失败，则显示错误信息。
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _loadFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
                    // 如果加载过程中出现错误，记录严重错误并显示错误信息。
          if (snapshot.hasError) {
            Logger('main').severe('Failed to load POS module', snapshot.error);
            return Center(child: Text('Error: ${snapshot.error}'));
          }
          Logger('main').info('POS module loaded successfully.');
                    // 加载成功，记录日志并创建并显示 POS 应用的主 Widget。
          return pos_entry.createPosApp();
                } else {
          // 当 Future 还在进行中时，显示一个居中的圆形进度指示器。
          return const Center(child: CircularProgressIndicator());
          return const Center(child: CircularProgressIndicator());
        }
      },
    );
  }
}
